﻿using System;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Windows.Forms;

namespace Siav
{
    public partial class frmBaixaItensPedidos : Form
    {
        public frmBaixaItensPedidos()
        {
            InitializeComponent();
        }
        NumberFormatInfo nfi = new CultureInfo("pt-br", false).NumberFormat;
        SiavEntities Entidades = new SiavEntities();
        //public int UsuarioBaixador; 
        private void CarregaPedidoParaBaixa(string pPedido)
        {
            try
            {
                if (pPedido != "-1")
                {
                    int CodigoPedido = int.Parse(pPedido);
                    var Pedido = Entidades.PedidoCabeca.FirstOrDefault(ped => ped.CodigoPedido.Equals(CodigoPedido));

                    txtNomeCliente.Text = Pedido.Clientes.RazaoSocial;
                    txtDataEntrega.Text = Pedido.DataEntrega.ToShortDateString();
                    CarregaProdutosLista(pPedido);
                    if (Pedido.Status == "F")
                    {
                        MessageBox.Show("Esse pedido ja se encontra baixado! não é possivel re-abrir o mesmo", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        gpbAcoes.Enabled = false;
                        gpbBaixaItens.Enabled = false;
                        gpbFechamento.Enabled = false;
                    }
                    else
                    {
                        gpbAcoes.Enabled = true;
                        gpbBaixaItens.Enabled = true;
                        gpbFechamento.Enabled = true;
                    }
                }
            }
            catch
            {
                MessageBox.Show("Pedido não encontrado", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        public void CarregaProdutosLista(string pCodigo)
        {
            lstProdutos.Items.Clear();
            int CodigoPedido = int.Parse(pCodigo);
            var Prods = (from p in Entidades.PedidoDetalhes
                         where p.item_ped_codigo.Equals(CodigoPedido)
                         select p).ToList();
            decimal totalV = 0;
            decimal preco = 0;
            decimal peso = 0;
            decimal totalP = 0;
            int i = 1;
            int pedido = int.Parse(pCodigo);
            var qtdVolumes = (from vol in Entidades.PedidoDetalhes
                              where vol.item_ped_codigo.Equals(pedido)
                              select new { valor = vol.item_numero_volumes }).Sum(p => p.valor);
            txtValumes.Text = qtdVolumes.ToString();
            foreach (PedidoDetalhes Ped in Prods)
            {
                ListViewItem item = new ListViewItem();
                if (Ped.item_baixado == "SIM")
                {
                    item.BackColor = Color.GreenYellow;
                }
                //CodigoItem = Ped.item_codigo;
                item.Text = Ped.item_codigo.ToString();
                item.SubItems.Add(i.ToString());
                item.SubItems.Add(Ped.Produtos.NomeProduto);
                if (Ped.item_quantidade_final == null)
                {
                    item.SubItems.Add(Ped.item_quantidade.ToString());
                }
                else
                {
                    item.SubItems.Add(Ped.item_quantidade_final.ToString());
                }
                item.SubItems.Add(Ped.item_unidade);
                item.SubItems.Add(Ped.item_largura.ToString());
                item.SubItems.Add(Ped.item_altura.ToString());
                item.SubItems.Add(Ped.item_espessura.ToString());
                //nfi.CurrencyDecimalDigits = 2;
                nfi.NumberDecimalDigits = 2;
                item.SubItems.Add(Ped.item_valor_kg.Value.ToString("N", nfi));
                nfi.NumberDecimalDigits = 3;
                item.SubItems.Add(Ped.item_peso_total.ToString());
                item.SubItems.Add(Ped.item_peso_final.ToString());
                nfi.NumberDecimalDigits = 2;
                item.SubItems.Add(Ped.item_valor_total.Value.ToString("N", nfi));               
                item.SubItems.Add(Ped.item_numero_volumes.ToString());
                lstProdutos.Items.Add(item);
                string Vvalor = item.SubItems[11].Text;
                string Vpeso = item.SubItems[9].Text;
                preco = decimal.Parse(Vvalor);
                peso = decimal.Parse(Vpeso);
                totalV = totalV + preco;
                totalP = totalP + peso;
                i++;
            }
            nfi.NumberDecimalDigits = 2;
            txtValorTotalPedido.Text = totalV.ToString("N", nfi);
            nfi.NumberDecimalDigits = 2;
            txtPesoTotalPedido.Text = totalP.ToString("N", nfi);
        }

        public void Calculos(string pTipoCalculo, string pQuantidade, string pLargura, string pAltura, string pEspessura, string pValor)
        {
            try
            {
                if (pQuantidade == "")
                {
                    pQuantidade = "1";
                }
                if (pLargura == "")
                {
                    pLargura = "0";
                }
                if (pAltura == "")
                {
                    pAltura = "0";
                }
                if (pEspessura == "")
                {
                    pEspessura = "0";
                }
                if (pValor == "")
                {
                    pValor = "0";
                }

                decimal Quantidade = decimal.Parse(pQuantidade);
                decimal Largura = decimal.Parse(pLargura);
                decimal Altura = decimal.Parse(pAltura);
                decimal Espessura = decimal.Parse(pEspessura);
                decimal Valor = decimal.Parse(pValor);

                decimal PesoMilheiro = (Largura * Altura * Espessura);
                decimal ValorPorMilheiro = (PesoMilheiro * Valor);
                decimal ValorTotal = (ValorPorMilheiro * Quantidade);
                ValorPorMilheiro = (ValorTotal) / Quantidade;
                decimal PesoTotal = PesoMilheiro * Quantidade;


                nfi.CurrencyDecimalDigits = 2;

                if (pTipoCalculo == "ML")
                {
                    nfi.NumberDecimalDigits = 2;
                    txtValorTotalItem.Text = ValorTotal.ToString("N", nfi);
                    txtValorMilheiro.Text = ValorPorMilheiro.ToString("N", nfi);
                    nfi.NumberDecimalDigits = 3;
                    txtPesoTotalItem.Text = PesoTotal.ToString("N", nfi);

                }
                if (pTipoCalculo == "KG")
                {
                    nfi.NumberDecimalDigits = 2;
                    txtValorTotalItem.Text = (Valor * Quantidade).ToString("N", nfi);
                    nfi.NumberDecimalDigits = 3;
                    txtPesoTotalItem.Text = Quantidade.ToString("N", nfi);
                }

            }
            catch
            {
                MessageBox.Show("Informe apenas dados numericos", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }


        public void btnCarregarPedido_Click(object sender, EventArgs e)
        {
            try
            {
                if (txtNumeroPedido.Text == "")
                {
                    MessageBox.Show("Informe o número do pedido para baixar", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    CarregaPedidoParaBaixa(txtNumeroPedido.Text);
                }
            }
            catch
            {
                MessageBox.Show("Erro! Pedido não encontrado", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void txtQuantidade_TextChanged(object sender, EventArgs e)
        {
            Calculos(txtTipoCalculo.Text, txtQuantidade.Text, txtLargura.Text, txtAltura.Text, txtEspessura.Text, txtValorKG.Text);
        }

        private void btnBaixarSelecionado_Click(object sender, EventArgs e)
        {
            try
            {
                int ProdutoSelecionado = int.Parse(lstProdutos.SelectedItems[0].Text);
                var ItemSelect = Entidades.PedidoDetalhes.FirstOrDefault(pr => pr.item_codigo.Equals(ProdutoSelecionado));
                txtQuantidade.Text = ItemSelect.item_quantidade.Value.ToString("N", nfi);
                nfi.NumberDecimalDigits = 2;
                txtValorKG.Text = ItemSelect.item_valor_kg.Value.ToString("N", nfi);
                txtLargura.Text = ItemSelect.item_largura.Value.ToString("N", nfi);
                txtAltura.Text = ItemSelect.item_altura.Value.ToString("N", nfi);
                txtEspessura.Text = ItemSelect.item_espessura;
                txtTipoCalculo.Text = ItemSelect.item_unidade;
                txtCodigoItem.Text = ProdutoSelecionado.ToString();
                if (ItemSelect.item_unidade == "ML")
                {
                    if (ItemSelect.item_valor_milheiro != null)
                    {
                        txtValorMilheiro.Text = ItemSelect.item_valor_milheiro.Value.ToString("N", nfi);
                    }
                }


                Calculos(txtTipoCalculo.Text, txtQuantidade.Text, txtLargura.Text, txtAltura.Text, txtEspessura.Text, txtValorKG.Text);
                btnBaixarItem.Enabled = true;
            }
            catch
            {
                MessageBox.Show("Erro! Selecione algum item do pedido primeiro", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnBaixarItem_Click(object sender, EventArgs e)
        {
            try
            {
                int Items = int.Parse(txtCodigoItem.Text);
                var BaixaItem = Entidades.PedidoDetalhes.FirstOrDefault(pr => pr.item_codigo.Equals(Items));
                BaixaItem.item_valor_total = decimal.Parse(txtValorTotalItem.Text);
                BaixaItem.item_valor_kg = decimal.Parse(txtValorKG.Text);
                BaixaItem.item_quantidade_final = decimal.Parse(txtQuantidade.Text);
                //BaixaItem.item_peso_total = decimal.Parse(txtPesoTotalItem.Text);
                BaixaItem.item_peso_final = decimal.Parse(txtPesoTotalItem.Text);
                if (txtTipoCalculo.Text == "ML")
                {
                    BaixaItem.item_valor_milheiro = decimal.Parse(txtValorMilheiro.Text);
                }
                if (txtItemVolumes.Text != "")
                {
                    BaixaItem.item_numero_volumes = int.Parse(txtItemVolumes.Text);
                }
                else
                {
                    BaixaItem.item_numero_volumes = 0;
                }
                BaixaItem.item_baixado = "SIM";
                BaixaItem.item_baixa_datahora = DateTime.Now; //Campo adicionado em revisao (Davi)
                BaixaItem.item_baixado_usuario = Validacoes.Usuario; //Campo adicionado em revisão (Davi)
                Entidades.ObjectStateManager.ChangeObjectState(BaixaItem, EntityState.Modified);
                Entidades.SaveChanges();
                CarregaProdutosLista(txtNumeroPedido.Text);
                btnBaixarItem.Enabled = false;
                //Limpar campos
                txtQuantidade.Text = string.Empty;
                txtValorKG.Text = string.Empty;
                txtValorTotalItem.Text = string.Empty;
                txtPesoTotalItem.Text = string.Empty;
                txtItemVolumes.Text = string.Empty;
                //
            }
            catch
            {
                MessageBox.Show("Erro ao baixar o item selecionado, entre em contato com a Aptos Tecnologia", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void txtValorKG_TextChanged(object sender, EventArgs e)
        {
            Calculos(txtTipoCalculo.Text, txtQuantidade.Text, txtLargura.Text, txtAltura.Text, txtEspessura.Text, txtValorKG.Text);
        }
        private void VerificaItensBaixa(int Pedido)
        {
            var PedsC = Entidades.PedidoDetalhes.Where(p => p.item_ped_codigo == Pedido);
            foreach (PedidoDetalhes Peds in PedsC)
            {
                if (Peds.item_baixado == null)
                {
                    //MessageBox.Show("Há itens não baixados no pedido!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    //break;
                }
            }
        }
        private void btnFechaPedido_Click(object sender, EventArgs e)
        {
            try
            {
                int Pedido = int.Parse(txtNumeroPedido.Text);
                var PedsC = Entidades.PedidoDetalhes.Where(p => p.item_ped_codigo == Pedido);
                string ItensNaoBaixados = "N";
                foreach (PedidoDetalhes Peds in PedsC)
                {
                    if (Peds.item_baixado == null)
                    {
                        MessageBox.Show("Há itens não baixados no pedido!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        ItensNaoBaixados = "S";
                    }
                }
                if (ItensNaoBaixados == "N") {
                    if (MessageBox.Show("Tem Certeza que deseja fechar o pedido? Após o mesmo ser fechado não poderá ser reaberto!", "Questão", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        var PedidoSQL = Entidades.PedidoCabeca.FirstOrDefault(peds => peds.CodigoPedido.Equals(Pedido));

                        decimal ValorTotal = decimal.Parse(txtValorTotalPedido.Text);
                        decimal ICMS = ValorTotal * 17 / 100; //Aliquota de ICMS
                        decimal IPI = ValorTotal * 5 / 100; //Aliquota de IPI
                        decimal PIS = ValorTotal * 2 / 100; //Aliquota de PIS
                        decimal COFINS = ValorTotal * 2 / 100; //Aliquota de COFINS

                        PedidoSQL.ICMS = ICMS;
                        PedidoSQL.IPI = IPI;
                        PedidoSQL.PIS = PIS;
                        PedidoSQL.COFINS = COFINS;
                        PedidoSQL.Status = "F";
                        PedidoSQL.NVolumes = txtValumes.Text;
                        PedidoSQL.ValorTotal = ValorTotal;
                        PedidoSQL.DataHoraBaixa = DateTime.Now;

                        Entidades.ObjectStateManager.ChangeObjectState(PedidoSQL, EntityState.Modified);
                        Entidades.SaveChanges();
                        MessageBox.Show("Pedido Fechado com sucesso", "Informação", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        Close();
                        if (MessageBox.Show("Deseja emitir a NF-e", "Questão", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                        {
                            frmEmiteNFe NFe = new frmEmiteNFe();
                            NFe.CodigoPedido = txtNumeroPedido.Text;
                            NFe.ShowDialog();
                            Close();
                        }
                    }
                }
            }
            catch
            {
                MessageBox.Show("Erro ao baixar o pedido!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnLocalizarPedido_Click(object sender, EventArgs e)
        {
            frmPesquisaPedidos PesqPedidos = new frmPesquisaPedidos();
            PesqPedidos.ShowDialog();
            CarregaPedidoParaBaixa(PesqPedidos.CodigoSelecionado);
            if (PesqPedidos.CodigoSelecionado != "-1")
            {
                txtNumeroPedido.Text = PesqPedidos.CodigoSelecionado;
            }
        }

        private void frmBaixaItensPedidos_Load(object sender, EventArgs e)
        {

        }
    }
}
